/*
 * @Author: soso
 * @Date: 2022-01-11 10:35:21
 * @LastEditTime: 2022-03-03 17:15:35
 * @LastEditors: Please set LastEditors
 * @Description:
 * @FilePath: /file-sync/core/cfiles/file.go
 */
package cfiles

import (
	"bytes"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"

	"gitee.com/kimsoso/go-utils/utils"
)

/**
 * @description: 创建空的带填补数据文件，并再文件配置列表中加入fileMask全0的文件信息
 * @param {Cfile} cfile
 * @return {*}
 */
func NewEmptyFile(filePath string, fileSize int64) error {
	return utils.CreateEmptyFile(toRealSvrPath(filePath), fileSize)
}

// 创建文件掩码文件
func NewFileMaskFile(filePath string, fileMask []byte) {
	ioutil.WriteFile(toFileMaskFilePath(filePath), fileMask, os.ModePerm)
}

/**
 * @description: 创建一个空文件
 * @param {string} filePath
 * @return {*}
 */
func touchAFile(filePath string) error {
	dir := filepath.Dir(filePath)
	_, err := os.Stat(dir)
	if err != nil {
		os.MkdirAll(dir, os.ModePerm)
	}

	file, err := os.Create(filePath)
	if err != nil {
		return err
	}

	defer file.Close()
	return err
}

// 修改文件指定位置的掩码
func SetFileMaskBit(filepath string, idx int, bitMode int) {
	TempCmds.Lock()
	defer TempCmds.Unlock()

	TempCmds.UpdateFileMask(filepath, idx, bitMode)
}

// 删除文件或者目录
func deleteFileOrDir(bufCmd []byte) {
	params := bytes.Split(bufCmd, []byte(":"))
	filepath := string(params[2])

	_, err := os.Stat(toRealSvrPath(filepath))
	if err == nil {
		SetDeleteFileCommand(filepath)
		realPath := toRealSvrPath(filepath)
		os.RemoveAll(realPath)
		os.RemoveAll(getUploadCmdPath(realPath))
	}
}

/**
 * @description: 删除文件或者目录
 * @param {[]byte} bufCmd
 * @return {*}
 */
func deleteFilesOrDirs(bufCmd []byte) error {
	params := bytes.Split(bufCmd, []byte(":"))
	filepathsBuf := params[2]
	filepaths := strings.Split(string(filepathsBuf), "|")

	for _, filePath := range filepaths {
		realPath := toRealSvrPath(filePath)
		_, err := os.Stat(realPath)
		if err == nil {
			SetDeleteFileCommand(filePath)
			RemoveSvrFileWithRelPath(filePath)
		}
	}
	return nil
}

// 以传输路径移除文件
func RemoveSvrFileWithRelPath(filePath string) {
	// 移除文件
	os.RemoveAll(toRealSvrPath(filePath))
	// 移除文件掩码
	os.Remove(toFileMaskFilePath(filePath))
	// 移除上传临时记录
	os.Remove(getUploadCmdPath(toRealSvrPath(filePath)))
}

// 以绝对路径移除文件
func RemoveSvrFileWithRealPath(filePath string) {
	// 移除文件
	os.RemoveAll(filePath)
	// 移除文件掩码
	os.Remove(getFileMaskFilePath(filePath))
	// 移除上传临时记录
	os.Remove(getUploadCmdPath(filePath))
}
